package com.beiding.mpTimer;


import java.io.Serializable;

/**
 * 时间轴对象
 * <p>
 * 时间轴对象并不一定就是时间轴持有者.当在集群中存在多个实例时,多个实例需要竞争时间轴
 */
public interface TimerShaft {

    /**
     * 延时执行一个任务
     *
     * @param payload  负载必须是可序列化的.最终处理任务时将以对象的类和任务主题作为Key来比对处理器进行任务处理
     * @param topic    主题
     * @param duration 延时时间,单位ms
     * @return 任务的Id
     */
    String delay(Serializable payload, String topic, long duration);

    /**
     * 准时处理任务
     *
     * @param payload 负载
     * @param time    处理时间
     * @return 任务id
     */
    String onTime(Serializable payload, String topic, long time);


    /**
     * 使某个任务失效
     *
     * @param tackId 任务Id
     * @return 被失效的任务负载
     */
    Object invalidate(String tackId);


    /**
     * 使用负载和主题对任务失效
     *
     * @param payload 负载
     */
    void invalidate(Serializable payload, String topic);


}
